///\file

#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <server_main.h>
#include <server.h>

/**
 * \mainpage
 *
 * \authors João Donato da Silva Petroni
 * \authors Lucas Alexandre Mello Magalhaes
 * \authors Marcelo Yukio Bressan Hossomi
 *
 *
 * Informações para o uso:
 * =======================
 * Para compilar:
 * --------------
 *  - make:\n
 *     Compila o código fonte gerando os executáveis "client" e "server".
 *  - make doc:\n
 *     Gera a documentação a partir do doxygen em html e pdf.
 *  - make clean:\n
 *     Apaga os executáveis e a documentação.
 *
 * Para executar:
 * --------------
 *  - Pelo script (pasta scripts):	
 *    - server_start.sh:\n
 *	Executa o servidor com todos os parâmetros já configurados.
 *    - exec.sh:\n
 *      Executa os clientes nos nós do cluster pedindo a operação que será executada e utilizando
 *      as entradas da pasta input.
 *  - Pelo executável (pasta bin):
 *    - server -u user -p password -d data_base\n
 *      Executa o servidor que se conecta ao banco de dados com o usuário/senha/banco passados pelos
 *	argumentos. Após a conexão o servidor fica apto a receber requisições RPC.
 *    - client hostname filename\n
 *      Executa o cliente que se conecta ao servidor em hostname, salvando os resultados
 *      em filename.
 */

static void termination_handler(int sig);
static inline void err_arg();

int main(int argc, char* argv[]){
	int loop     = 0;
	int user     = 0;
	int password = 0;
	int dataBase = 0;
	//Verificação dos argumentos
	if(argc != 7)
		err_arg();
	for(loop = 1;loop < argc;loop++){
		if(argv[loop][0] == '-' && argv[loop][2] == '\0'){
			switch(argv[loop][1]){
			case 'u':
				if(loop + 1 < argc)
					user = ++loop;
				else
					err_arg();
				break;
			case 'p':
				if(loop + 1 < argc)
					password = ++loop;
				else
					err_arg();
				break;
			case 'd':
				if(loop + 1 < argc)
					dataBase = ++loop;
				else
					err_arg();
				break;
			default:
				err_arg();
			}
		}else{
			err_arg();
		}
	}	
	//Conexão com o MySQL
	if(!server_connectDataBase("localhost",0,argv[user],argv[password],argv[dataBase]))
		return 1;
	memset(argv[password],0,strlen(argv[password]));
	//Quando o programa receber um SIGTERM (kill)
	signal(SIGTERM,termination_handler);
	//Quando o programa receber um SIGINT (Ctrl+C)
	signal(SIGINT,termination_handler);
	//Inicialização do RPC
	rpc_start();
	return 0;
}

/**
* \brief Encerra o servidor.
*	Ao receber um SIGTERM (kill) ou SIGINT (Ctrl+C) o servidor executa esta função que se 
* encerrega de de fechar os arquivos e conexões com o banco de dados.
* \param sig Sinal recebido.
*/
void termination_handler(int sig){
	puts("");
	server_closeConnection();
	printf("Server closed.\n");
	exit(0);
}

static inline void  err_arg(){                                 
	fprintf(stderr,"Wrong arguments.\nserver <-u> user <-p> password <-d> database.\n");
	exit(1);
}
